﻿using System;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using ContactManagement.Models;
using ContactManagement.Models.DynamicData;
using ContactMvc4TB.Helpers.DynamicDataType;
using ContactMvc4TB.Helpers.DynamicDataType.Creation;
using ContactMvc4TB.Helpers.MvcBasics;
using EFDataModel.DataCreation;
using Microsoft.Web.Helpers;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using WebPilot;

namespace ContactMvc4TB
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);


            //Zusätzliche ModelBinder registrieren
            AddModelBinder();

            FillLists fillLists = new FillLists(CurrentHttpContext.GetDataModel());
            fillLists.CreateListItems();
            CreateSampleData createSampleData = new CreateSampleData(CurrentHttpContext.GetDataModel());
            createSampleData.CreateData();

            //Initialisieren der Catpcha Keys, muss nur einmal Applikationsweit initialisiert werden, dann kann das Captcha problemlos erstellt werden.
            //http://midnightprogrammer.net/post/Working-With-Microsoft-Web-Helpers-In-MVC-3-Razor-View.aspx
            //http://ihatethissite.com/blog/2011/02/27/recaptcha-with-asp-net-mvc-razor-using-microsoft-web-helpers/
            ReCaptcha.PublicKey = WebConstants.PublicCaptchaKey;
            ReCaptcha.PrivateKey = WebConstants.PrivateCaptchaKey;
        }

        /// <summary>
        /// Zusätrzliche Modelbinder für die Webseite registrieren
        /// </summary>
        private void AddModelBinder()
        {
            //WICHTIG: Registrieren des Custom Modelbinders für unseren Datentyp EFDataType,
            //dafür muss jedes Model dem Modelbinder hinzugefügt werden wo unsere Auflistung von EFDataType vorkommt!
            ModelBinders.Binders.Add(typeof(EditUserAdminModel), new DynamicDataModelBinder());

            //Model Binden um beim Bearbeiten eines Dynamischen Datentyps den aktuellen Dynamischen Datentyp wieder zu laden
            ModelBinders.Binders.Add(typeof(EditModel), new EditModelDynamicDataModelBinder());
            ModelBinders.Binders.Add(typeof(EditModelList), new EditModelDynamicDataModelBinder());

            //Custom Datetime Modelbinder für DateTime? Values für die Arbeitszeitverwaltung
            ModelBinders.Binders.Add(typeof (DateTime?), new DateTimeModelBinder());
        }

        /// <summary>
        /// Abfangen von Application Errors
        /// </summary>
        protected void Application_Error(object sender, EventArgs e)
        {
            //Dei Fehlermeldung abfangen und dann im ErrorController verarbeiten.
            Exception ex = Server.GetLastError();
            EFDebugging.Debugging.WriteLog("Application_Error: ", ex);
            Application[HttpContext.Current.Request.UserHostAddress.ToString()] = ex;
        }
    }
}